package persistencia;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import negocio.CEP;

public class MyCEPDAO extends ConexaoMySQLDAO{
    
    private PreparedStatement stIncluir;
    private PreparedStatement stPesquisaCodigo;
    private PreparedStatement stPesquisaNome;
    private PreparedStatement stListar;
    private PreparedStatement stAtualiza;
    private final Connection con;
    
    public MyCEPDAO() throws IOException, SQLException {
        con = super.getConexao();
        stIncluir = con.prepareStatement(
                "INSERT INTO cep (id_cep, logradouro, cidade, estado, pais) VALUES (?, ?, ?, ?, ?)");
        stListar = con.prepareStatement(
                "SELECT * FROM cep");
        stPesquisaCodigo = con.prepareStatement(
                "SELECT * FROM cep WHERE id_cep=?");
        stPesquisaNome = con.prepareStatement(
                "SELECT * FROM cep WHERE logradouro LIKE ?");
        stAtualiza = con.prepareStatement(
                "UPDATE cep SET logradouro=?, cidade=?, estado=?, pais=? WHERE id_cep=?");
    }
    
        public void adiciona(CEP umCEP) throws Exception {
        stIncluir.setInt(1, umCEP.getId_cep());
        stIncluir.setString(2, umCEP.getLogradouro());
        stIncluir.setString(3, umCEP.getCidade());
        stIncluir.setString(4, umCEP.getEstado());
        stIncluir.setString(5, umCEP.getPais());
        stIncluir.executeQuery();
    }

    public List<CEP> getCEPs() throws Exception {
        return getLista(stListar.executeQuery());
    }

    public void altera(CEP novoCEP) throws Exception {
        stAtualiza.setString(1, novoCEP.getLogradouro());
        stAtualiza.setString(2, novoCEP.getCidade());
        stAtualiza.setString(3, novoCEP.getEstado());
        stAtualiza.setString(4, novoCEP.getPais());
        stAtualiza.setInt(5, novoCEP.getId_cep());
        stAtualiza.executeUpdate();
    }

    public List<CEP> procuraPorNome(String chave) throws Exception {
        stPesquisaNome.setString(1, chave + "%");
        return getLista(stPesquisaNome.executeQuery());
    }

    public CEP procuraPorCodigo(int codigo) throws Exception {
        stPesquisaCodigo.setInt(1, codigo);
        List<CEP> res = getLista(stPesquisaCodigo.executeQuery());
        if (res.isEmpty()) {
            throw new Exception("Registro não encontrado");
        }
        return res.get(0);
    }

    private List<CEP> getLista(ResultSet rs) throws Exception {
        List<CEP> tmp = new ArrayList<CEP>();
        while (rs.next()) {
            tmp.add(montaObjeto(rs));
        }
        return tmp;
    }

    private CEP montaObjeto(ResultSet rs) throws SQLException {
        CEP umCEP = new CEP();
            umCEP.setId_cep(rs.getInt("id_cep"));
            umCEP.setLogradouro(rs.getString("logradouro"));
            umCEP.setCidade(rs.getString("cidade"));
            umCEP.setEstado(rs.getString("estado"));
            umCEP.setPais(rs.getString("pais"));
            
        return umCEP;
    }

}